package com.tth.learn.addproperties.java3;

import org.junit.Test;

import java.util.Optional;

/**
 * @Author tth
 * @Date 2023/1/4 14:47
 */
public class OptionalTest {

    /**
     * 实例化Optional
     */
    @Test
    public void test1() {
        // 方法一：Optional of(T value)：value必须是非空的。否则报空指针异常
        Girl girl = new Girl();
        Optional<Girl> girl1 = Optional.of(girl);
        System.out.println(girl1); //Optional[Girl{name='null'}]

        System.out.println("*******************************************************");

        // 方法二：Optional ofNullable(T value)：value可以为空
        girl = null;
        Optional<Girl> girl2 = Optional.ofNullable(girl);
        System.out.println(girl2); //Optional.empty

        System.out.println("*******************************************************");

        // 方法三：Optional.empty()：创建一个空的Optional实例
        Optional<Girl> girl3 = Optional.empty();
        System.out.println(girl3); //Optional.empty
    }

    /**
     * Optional是如何避免空指针的
     */
    @Test
    public void test2() {
        Boy boy = null;
        String girName = getGirName(boy);
        System.out.println(girName);
    }

    /**
     * 返回boy中girl对象的名字
     *  Optional<T> ofNullable(T value) 与 T orElse(T other)的使用
     * @param boy
     * @return
     */
    public String getGirName(Boy boy) {
        // 如果使用下面语句，当boy为空或者boy中girl的属性为空时，都会报空指针异常
        // return boy.getGirl().getName();

        // 使用Optional避免空指针异常
        Optional<Boy> boyOptional = Optional.ofNullable(boy);
        // 此时boy1一定非空，且boy1中的girl也一定非空
        Boy boy1 = boyOptional.orElse(new Boy(new Girl("迪丽热巴")));
        return boy1.getGirl().getName();
    }

}
